#include <iostream>

using namespace std;

// 关于::的使用情况，我还是先去仔细看看Google的c++规范吧
class Date {
public:
    Date();

    Date(int year, int month, int day);

    Date(const Date &date);

    ~Date();

    bool operator==(const Date &date) const;

    bool operator!=(const Date &date) const;

    void printDate();

    void setToNextDay();

    void setDate(int year, int month, int day);

private:
    int year = 1970;
    int month = 1;
    int day = 1;

    int getMaxDayOfMonth() const;
};

Date::Date(int year, int month, int day) : year(year), month(month), day(day) {}

Date::Date() : year(1900), month(1), day(1) {}

Date::Date(const Date &date) {
    Date::year = date.year;
    Date::month = date.month;
    Date::day = date.day;
}

Date::~Date() {
    std::cout << "Don'..........t.........go.........away.......... (weakly)" << std::endl;
}

bool Date::operator==(const Date &date) const {
    return year == date.year &&
           month == date.month &&
           day == date.day;
}

bool Date::operator!=(const Date &date) const {
    return !(year == date.year &&
             month == date.month &&
             day == date.day);
}

void Date::printDate() {
    std::cout << "--------------------------" << endl;
    std::cout << "- year: " << year << std::endl
              << "- month: " << month << std::endl
              << "- day: " << day << std::endl;
    std::cout << "--------------------------" << endl;
}

void Date::setToNextDay() {
    Date::day++;

    // 检查一下是不是到了下一个月
    if (Date::day > getMaxDayOfMonth()) {
        Date::day = 1;
        Date::month++;

        // 再检查一下是不是到了下一年
        if (Date::month > 12) {
            Date::month = 1;
            Date::year++;
        }
    }
}

void Date::setDate(int year, int month, int day) {
    Date::year = year;
    Date::month = month;
    Date::day = day;
}

int Date::getMaxDayOfMonth() const {
    switch (Date::month) {
        default:
            return 0;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        case 2:
            if (Date::year % 4 == 0) {
                if (Date::year % 100 == 0) {
                    return (Date::year % 400) == 0 ? 29 : 28;
                } else {
                    return 29;
                }
            }
            return 28;
    }
}

int main() {
    Date defaultDate;
    Date *constructorDate = new Date(2020, 3, 4);

    std::cout << "[defaultDate]:" << std::endl;
    defaultDate.printDate();

    std::cout << "[constructorDate]:" << std::endl;
    constructorDate->printDate();

    std::cout << "[constructorDate - setDay()]:" << std::endl;
    constructorDate->setDate(2021,12,31);
    constructorDate->printDate();

    std::cout << "[constructorDate - setToNextDay()]:" << std::endl;
    constructorDate->setToNextDay();
    constructorDate->printDate();

    std::cout << "[Destructor]: ";
    delete constructorDate;
}


